2026-10-15T03:25:20.7319197Z ##[group]Run npm run test:deploy
2026-10-15T03:25:20.7319229Z [36;1mnpm run test:deploy[0m
2026-10-15T03:25:20.7319242Z shell: /usr/bin/bash -e {0}
2026-10-15T03:25:20.7319251Z env:
2026-10-15T03:25:20.7319258Z   CARGO_TERM_COLOR: never
2026-10-15T03:25:20.7319329Z   CLOUDFLARE_ACCOUNT_ID: 1e6f2cffa3f445920836e8ebe446bb58
2026-10-15T03:25:20.7319336Z   WRANGLER_SEND_METRICS: false
2026-10-15T03:25:20.7319342Z ##[endgroup]
2026-10-15T03:25:20.8346569Z 
2026-10-15T03:25:20.8346742Z > test:deploy
2026-10-15T03:25:20.8346769Z > node --test "scripts/deploy/*.test.mjs"
2026-10-15T03:25:20.8346782Z 
2026-10-15T03:25:20.9409805Z ✔ a release's version bump keeps the Rust caches' key, a new dependency changes it (2.051189ms)
2026-10-15T03:25:20.9418190Z ✔ the toolchain is read from rustc -V (0.25792ms)
2026-10-15T03:25:20.9421768Z ✔ the CLI's builder image is pinned, and keys its cache by its digest (0.23686ms)
2026-10-15T03:25:20.9429824Z ✔ a unit's hash is read from its files and folders (0.254739ms)
2026-10-15T03:25:20.9429898Z ✔ only the units the build did not use are pruned (2.64152ms)
2026-10-15T03:25:23.2076704Z error: no matching package named `base64` found
2026-10-15T03:25:23.5207558Z location searched: crates.io index
2026-10-15T03:25:23.5207700Z required by package `g1t-api v0.1.0 (/home/runner/work/repo/apps/api)`
2026-10-15T03:25:23.5207769Z note: offline mode (via `--offline`) can sometimes cause surprising resolution failures
2026-10-15T03:25:23.5207847Z help: if this error is too confusing you may wish to retry without `--offline`
2026-10-15T03:25:23.5207923Z ✔ the manifest matches every wrangler config in the repository (31.634768ms)
2026-10-15T03:25:23.5207991Z ✔ every wrangler.jsonc is found, and only checked-in ones (21.867389ms)
2026-10-15T03:25:23.5208182Z ✔ problems are found: an unlisted config, a later-stage binding, a wrong database, an unnamed KV (25.924358ms)
2026-10-15T03:25:23.5208253Z ✔ stages follow bindings: nothing binds to a unit that ships after it (0.41283ms)
2026-10-15T03:25:23.5208322Z ✔ inside a stage, a Worker that does not exist yet goes before those bound to it (0.6747ms)
2026-10-15T03:25:23.5208379Z ✔ Rust workers build with the shared script and the same wasm-opt level (0.6574ms)
2026-10-15T03:25:23.5208421Z ✔ shared crates and packages are read from workspace metadata (0.26193ms)
2026-10-15T03:25:23.5208477Z ✔ the runner's image is built from the runner crate and what it uses, on the base its lock names (0.40348ms)
2026-10-15T03:25:23.5208517Z ✔ services/runner/base.json records the base its folder builds (9.287049ms)
2026-10-15T03:25:23.5208561Z ✔ an image's hash ignores line endings, and its tags say what they are (98.058635ms)
2026-10-15T03:25:23.5208600Z ✔ only the lockfile entries the runner is built from name its image (0.360969ms)
2026-10-15T03:25:23.5208642Z ✔ the runner's deploy config names its image by reference, beside its wrangler.jsonc (18.858639ms)
2026-10-15T03:25:23.5208763Z ✔ the registry is asked for an image's manifest, without Docker (1.00899ms)
2026-10-15T03:25:23.5208805Z ✔ a push counts only when it ends with a digest, and is tried again (0.7603ms)
2026-10-15T03:25:23.5208844Z ✔ a static Linux binary is told from a dynamic one (0.84801ms)
2026-10-15T03:25:23.5208900Z ﹣ path dependencies agree with Cargo's own resolved graph (1935.745615ms) # cargo metadata could not resolve offline
2026-10-15T03:25:23.5208946Z ✔ every import that leaves a unit's folder is covered by its dependencies or inputs (59.820916ms)
2026-10-15T03:25:23.5209008Z ✔ a shared crate's change reaches every unit built from it, and no other (0.70835ms)
2026-10-15T03:25:23.5209069Z ✔ a shared package's change reaches what imports it (0.24753ms)
2026-10-15T03:25:23.5209135Z ✔ a crate's tests, benches and examples deploy nothing (0.39499ms)
2026-10-15T03:25:23.5209179Z ✔ a Rust file compiled only for tests is found from what declares it (1.14487ms)
2026-10-15T03:25:23.5209220Z ✔ this repository's test-only sources are read from git (178.183729ms)
2026-10-15T03:25:23.5209262Z ✔ decide: a change only to tests deploys nothing (1.012349ms)
2026-10-15T03:25:23.5209298Z ✔ own folders, declared inputs and root files (0.83817ms)
2026-10-15T03:25:23.5209335Z ✔ a Cargo.lock change reaches only crates that use what changed (0.43168ms)
2026-10-15T03:25:23.5209374Z ✔ a package-lock change reaches through workspace links (0.48718ms)
2026-10-15T03:25:23.5209411Z ✔ decide: changed units deploy, others wait, unknown ones deploy (0.35266ms)
2026-10-15T03:25:23.5209453Z ✔ decide: --force deploys unchanged units; a commit missing from history deploys (0.17656ms)
2026-10-15T03:25:23.5209492Z ✔ decide: Cargo.lock counts only where it reaches (0.4717ms)
2026-10-15T03:25:23.5209659Z ✔ decide: the runner's image rebuilds only when what it is built from changed (0.20009ms)
2026-10-15T03:25:23.5209707Z ✔ the plan as data: migrations, and each stage's units in jobs that share a build (0.76112ms)
2026-10-15T03:25:23.5209766Z ✔ units are picked by short name, folder or Worker name (1.37247ms)
2026-10-15T03:25:23.5209823Z ✔ a CI job installs only what its units need (2.14235ms)
2026-10-15T03:25:23.5209884Z ✔ a deploy is annotated with its commit, and read back (0.50636ms)
2026-10-15T03:25:23.5209949Z ✔ the live commit: the live version's, looking through secret changes (1.04241ms)
2026-10-15T03:25:23.5210015Z ✔ Wrangler's output: pending migrations and the version a deploy made (0.88848ms)
2026-10-15T03:25:23.5210078Z ✔ the API's answers: the live commit as Wrangler's would give it (3.05165ms)
2026-10-15T03:25:23.9693574Z ✔ the API's answers: a Worker never deployed, and a refusal, never throw (502.35036ms)
2026-10-15T03:25:23.9701954Z ✔ the API is used only with the token Wrangler would be given (0.82034ms)
2026-10-15T03:25:23.9702576Z ✔ pending migrations: the folder's files less the names in d1_migrations (1.59778ms)
2026-10-15T03:25:24.0241983Z ✔ the pool runs everything, no more than its limit at once (15.558979ms)
2026-10-15T03:25:24.0242139Z ✔ self-hosting builds every Rust service the manifest says it runs (0.69588ms)
2026-10-15T03:25:24.0276937Z ✔ the self-hosting architecture page names every unit (0.288471ms)
2026-10-15T03:25:24.0277069Z ✔ the architecture's services page names every unit, with the services it binds to (2.766749ms)
2026-10-15T03:25:24.0277140Z ✔ resolveStack works on a manifest with no workspace crates or packages (2.55328ms)
2026-10-15T03:25:24.0277232Z ✔ decide: a commit older than what runs is never deployed by accident, even forced; --rollback means it (0.26482ms)
2026-10-15T03:25:24.0277298Z ✔ a deploy by hand reports to the repository on g1t, and a workflow's does not (1.53584ms)
2026-10-15T03:25:24.0282292Z ✔ a failed wrangler command is reported by its error, not its trace (0.20571ms)
2026-10-15T03:25:24.0282387Z ✔ Cloudflare failing is tried again; a mistake in what is deployed is not (0.34117ms)
2026-10-15T03:25:24.0282480Z ✔ sandboxes roll over at once when their image or container settings changed, and not otherwise (0.24826ms)
2026-10-15T03:25:24.0309537Z ✔ the deploy tool itself parses: a test that never imports it would not notice (30.232108ms)
2026-10-15T03:25:24.6129441Z ✔ the statements are all there (1.22696ms)
2026-10-15T03:25:24.6129588Z ✔ twenty invites each: the twenty-first is refused in the statement that writes (47.865147ms)
2026-10-15T03:25:24.6129677Z ✔ revoking an unused invite gives it back; an expired one never counted (86.417905ms)
2026-10-15T03:25:24.6129745Z ✔ a used invite is spent: revoking it does nothing and it still counts (35.973618ms)
2026-10-15T03:25:24.6129790Z ✔ a pending invite for the same address is found; a revoked one is not (37.053348ms)
2026-10-15T03:25:24.6129841Z ✔ staff grants add to the twenty and can take some back (34.060608ms)
2026-10-15T03:25:24.6129888Z ✔ signing up from the link spends the invite once and records who invited whom (35.456257ms)
2026-10-15T03:25:24.6129935Z ✔ a body that broke off is worth another try, a lockfile out of step is not (1.42335ms)
2026-10-15T03:25:24.6129984Z ✔ an install that ends without saying why, or stalls, is tried again (0.19919ms)
2026-10-15T03:25:24.6130079Z ✔ a dropped connection is tried again until the install passes (1.03185ms)
2026-10-15T03:25:24.6130095Z ✔ a real error fails at once (0.22606ms)
2026-10-15T03:25:24.6130159Z ✔ it gives up after its tries, with npm's exit code (0.28322ms)
2026-10-15T03:25:24.6130185Z ✔ a stalled install is run again (0.21377ms)
2026-10-15T03:25:24.6130246Z ✔ webhooks: the hourly purge deletes old deliveries by time (1.77406ms)
2026-10-15T03:25:24.6130305Z ✔ billing: this month's users are read from an index, not the ledger (60.966216ms)
2026-10-15T03:25:24.6130348Z ✔ events: a repository's events of one type, newest first, page by page (4.199569ms)
2026-10-15T03:25:24.6130394Z ✔ actions: a self-hosted runner's poll finds queued jobs by namespace, whatever its case (16.146699ms)
2026-10-15T03:25:24.6130511Z ✔ chat: a channel's messages and a thread's replies, newest first, page by page (3.14167ms)
2026-10-15T03:25:24.6130568Z ✔ chat: the sidebar's unread messages are read from each channel's index, after the last read (2.99698ms)
2026-10-15T03:25:24.6130608Z ✔ chat: a page's reactions are read by message, and a workspace's emoji by name (2.84948ms)
2026-10-15T03:25:24.6937670Z ✔ the runner's layer is the binary alone, at its path and mode, owned by root (4.141099ms)
2026-10-15T03:25:24.6941523Z ✔ the layer and entrypoint are what services/runner/Dockerfile builds (0.45636ms)
2026-10-15T03:25:24.6946125Z ✔ the config is the base's, with the layer, the entrypoint and no inherited command (0.89089ms)
2026-10-15T03:25:24.6948848Z ✔ the manifest names the base's layers, then the binary's, in the base's format (0.35167ms)
2026-10-15T03:25:24.6976915Z ✔ image references and bearer challenges are read (0.51259ms)
2026-10-15T03:25:24.6977034Z ✔ the runner's image is made in the registry from the base's manifest and one new layer, pulling none of the base (26.206409ms)
2026-10-15T03:25:24.6977112Z ✔ a base that is not where it should be, or not what base.json says, stops it (0.98388ms)
2026-10-15T03:25:24.6977204Z ✔ a registry that asks for a bearer token is given the one its realm trades the credentials for (1.8186ms)
2026-10-15T03:25:24.7540123Z scheduler: g1t-webhooks (* * * * *) is still running from the last time; skipped
2026-10-15T03:25:24.7797168Z scheduler: g1t-webhooks (* * * * *): 200 {"outcome":"exception"}
2026-10-15T03:25:24.7822350Z ✔ fields read numbers, ranges, lists and steps (1.97269ms)
2026-10-15T03:25:24.7831919Z ✔ the services' crons match when hosted g1t's would fire (1.59687ms)
2026-10-15T03:25:24.7837409Z ✔ what is due is each matching cron of each service (0.45307ms)
2026-10-15T03:25:24.7842110Z ✔ a run asks Wrangler for the handler, and a slow one is not doubled (26.854298ms)
2026-10-15T03:25:24.8767517Z ✔ a deploy is announced to status.g1t.sh with the token, and without one nothing is sent (31.568369ms)
2026-10-15T03:25:24.8779149Z ✔ an announcement that fails is a warning, never a failed deploy (0.71628ms)
2026-10-15T03:25:24.8784318Z ✔ the stages run inside the window: started before, finished after, even when they throw; a dry run says nothing (0.813311ms)
2026-10-15T03:25:24.8786164Z ✔ deploy.mjs announces every deploy, and the workflow passes it the token (0.504829ms)
2026-10-15T03:25:24.8894204Z ℹ tests 92
2026-10-15T03:25:24.8894439Z ℹ suites 0
2026-10-15T03:25:24.8894582Z ℹ pass 91
2026-10-15T03:25:24.8894721Z ℹ fail 0
2026-10-15T03:25:24.8894872Z ℹ cancelled 0
2026-10-15T03:25:24.8895012Z ℹ skipped 1
2026-10-15T03:25:24.8895154Z ℹ todo 0
2026-10-15T03:25:24.8895292Z ℹ duration_ms 4018.35271
